package com.duoduo.common.api.myinterface;

import com.duoduo.common.api.JsonDeserializationException;
import com.duoduo.common.api.domain.JsonContainerClass;
import com.duoduo.common.api.spi.extension.SPI;
import com.duoduo.common.api.tuple.TwoTuple;
import com.fasterxml.jackson.databind.JsonNode;

import java.util.List;
import java.util.Map;

/**json工具类
 * @author duoduo
 *
 */
@SPI
public interface JsonOperator {
	
	/**
	 * 将JSON字符串转化为Java对象
	 * @param jsonStr
	 * @param valueType
	 * @return Object，发生异常返回null
	 */
	public <T> T jsonToObject(String jsonStr, Class<T> valueType) throws JsonDeserializationException;
	
	/**将JSON字符串转化为Java对象(支持普通类和容器类)
	 * @param jsonStr
	 * @param entityClass
	 * @return
	 */
	public <T> T jsonToObject(String jsonStr, JsonContainerClass<T> entityClass) throws JsonDeserializationException;
	
	/**
	 * 将json字符串转化为泛型容器，如map
	 * @author sangshan
	 * @param jsonStr 待转化json字符串
	 * @param containerClass 容器Class类
	 * @param genericsClasses 可变参数列表，表示容器泛型Class类
	 * @return 转化后的泛型容器
	 * *******************
	 * 例
	 * class User{}//用户数据，略
	 * String str = "{\"wjq\":{...},\"zsl\":{...}}";
	 * JacksonUtil.jsonToGenericContainer(str,Map.class,String.class,User.class);
	 */
	public <T> T jsonToGenericContainer(String jsonStr, Class<?> containerClass, Class<?>... genericsClasses) throws JsonDeserializationException;
	
	/**
	 * 将java对象转化为JSON
	 * @param object
	 * @return jsonStr，如果序列化失败返回null
	 */
	public String objecttoJSon(Object object);
	
	/**
	 * 将java对象转化为JSON，java对象必须实现序列化接口
	 * @param object
	 * @return jsonStr，如果序列化失败返回指定字符串
	 */
	public String serializableObjecttoJSon(Object object, String defaultString);

	/**往json串的currentNodeName节点下写入新值
	 * @param jsonStr
	 * @param currentNodeName 
	 * @param values 
	 * @return 新的json字符串
	 */
	public String putValue(String jsonStr, String currentNodeName, List<TwoTuple<String, Object>> values);

	/**删除paths路径下的指定节点
	 * @param jsonStr
	 * @param deleteNodeName
	 * @param paths
	 * @return
	 */
	public String deleteValue(String jsonStr, String deleteNodeName, String... paths);
	
	public JsonNode parseJsonNode(String jsonStr, String[] paths);

	/**获取字符类型的节点内容，如果不是字符，就返回null；如果不是内容节点，则返回从该节点开始的json字符串
	 * @param jsonStr
	 * @param paths
	 * @return
	 */
	public String getString(String jsonStr, String[] paths);

	public <T> T getPathObject(String json, Class<T> clazz, String... paths);

	public <T> List<T> getPathArray(String json, Class<T> clazz, String... paths);
	
	public <T, U> Map<T, U> getPathMap(String json, Class<T> keyClazz, Class<U> valueClazz, String... paths);

}
